package com.hua.Thread.future;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * @author: _hua
 * @created: 2019/3/9.
 * @updater:
 * @description:
 */

/**
 * boolean cancel(boolean mayInterruptInRunning) 取消一个任务，并返回取消结果。参数表示是否中断线程。
 * boolean isCancelled()                                        判断任务是否被取消
 * Boolean isDone() 　　                                       判断当前任务是否执行完毕，包括正常执行完毕、执行异常或者任务取消。
 * V get()                                                            获取任务执行结果，任务结束之前会阻塞。
 * V get(long timeout, TimeUnit unit)                    在指定时间内尝试获取执行结果。若超时则抛出超时异常
 */

/**
 * 这里模拟了1s钟的CPU空转，当执行future.get()的时候，主线程阻塞了大约一秒后获得结果。
 *
 *    当然我们也可以使用get(long timeout, TimeUnit unit)
 */

/**
 * 任务提交后、任务结束前取消任务，那么有可能变为CANCELLED或者INTERRUPTED。在调用cancel方法时，如果传入false表示不中断线程，state会被置为CANCELLED，反之state先被变为INTERRUPTING，后变为INTERRUPTED。
 *
 *      总结下，FutureTask的状态流转过程，可以出现以下四种情况：
 *
 *         1. 任务正常执行并返回。 NEW -> COMPLETING -> NORMAL
 *
 * 　　  2. 执行中出现异常。NEW -> COMPLETING -> EXCEPTIONAL
 *
 *         3. 任务执行过程中被取消，并且不响应中断。NEW -> CANCELLED
 *
 * 　　  4. 任务执行过程中被取消，并且响应中断。 NEW -> INTERRUPTING -> INTERRUPTED　　
 */
public class FutureDemo {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        Future future = executorService.submit(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                Long start = System.currentTimeMillis();
                while (true) {
                    Long current = System.currentTimeMillis();
                    if ((current - start) > 1000) {
                        return 1;
                    }
                }
            }
        });

        try {
            Integer result = (Integer)future.get();
            System.out.println(result);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
